#pragma once
#ifndef SINGLETON_H
#define SINGLETON_H
#include "const.h"

/**
 * @brief The Singleton class 单例类
 */
template<typename T>
class Singleton {
protected:
    Singleton() = default;
    Singleton(const Singleton<T>&) = delete;    //不需要拷贝构造
    Singleton& operator = (const Singleton<T>& st) = delete;    //不需要拷贝赋值
    static std::shared_ptr<T> _instance;    //智能指针
public:
    ~Singleton() {
        std::cout << "this is singleton destruct~" << std::endl;
    }

    //获取实例函数
    static std::shared_ptr<T> GetInstance() {
        static std::once_flag s_flag;
        std::call_once(s_flag, [&]() {
            _instance = std::shared_ptr<T>(new T);
            });

        return _instance;
    }

    //打印地址函数
    void PrintAddr() {
        std::cout << "singleton's address: " << _instance.get() << std::endl;
    }

};

//static类型的变量一定要初始化，又因为其在一个模板类中，因此需要使用模板类的初始化
template<typename T>
std::shared_ptr<T> Singleton<T>::_instance = nullptr;

#endif // SINGLETON_H
